scrolledwindow: Avoid a queue_resize path in size-allocate
authorTimm Bäder <mail@baedert.org>
Thu, 21 Jun 2018 15:43:26 +0000 (17:43 +0200)
committerTimm Bäder <mail@baedert.org>
Thu, 21 Jun 2018 18:54:47 +0000 (20:54 +0200)
gtk/gtkscrolledwindow.c

index 928019098f1a24b6dc4fdaae906dfa2c0be1a46e..354fbcd0d1329f96026e9d959d79ecc34ae9beaf 100644 (file)
@@ -1375,6 +1375,36 @@ scroll_controller_decelerate (GtkEventControllerScroll *scroll,
                                   initial_vel_y * unit_y);
 }
 
+static void
+gtk_scrolled_window_update_scrollbar_visibility_flags (GtkScrolledWindow *scrolled_window,
+                                                       GtkWidget         *scrollbar)
+{
+  GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
+  GtkAdjustment *adjustment;
+
+  if (scrollbar == NULL)
+    return;
+
+  adjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (scrollbar));
+
+  if (scrollbar == priv->hscrollbar)
+    {
+      if (priv->hscrollbar_policy == GTK_POLICY_AUTOMATIC)
+        {
+          priv->hscrollbar_visible = (gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_lower (adjustment) >
+                                      gtk_adjustment_get_page_size (adjustment));
+        }
+    }
+  else if (scrollbar == priv->vscrollbar)
+    {
+      if (priv->vscrollbar_policy == GTK_POLICY_AUTOMATIC)
+        {
+          priv->vscrollbar_visible = (gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_lower (adjustment) >
+                                      gtk_adjustment_get_page_size (adjustment));
+        }
+    }
+}
+
 static void
 gtk_scrolled_window_size_allocate (GtkWidget           *widget,
                                    const GtkAllocation *allocation,
@@ -1560,20 +1590,21 @@ gtk_scrolled_window_size_allocate (GtkWidget           *widget,
        {
          previous_hvis = priv->hscrollbar_visible;
          previous_vvis = priv->vscrollbar_visible;
+
          gtk_scrolled_window_allocate_child (scrolled_window, allocation);
 
-         /* Explicitly force scrollbar visibility checks.
-          *
-          * Since we make a guess above, the child might not decide to update the adjustments
-          * if they logically did not change since the last configuration
-          */
-         if (priv->hscrollbar)
-           gtk_scrolled_window_adjustment_changed
-              (gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->hscrollbar)), scrolled_window);
+          /* Explicitly force scrollbar visibility checks.
+           *
+           * Since we make a guess above, the child might not decide to update the adjustments
+           * if they logically did not change since the last configuration
+           *
+           * These will update priv->hscrollbar_visible and priv->vscrollbar_visible.
+           */
+          gtk_scrolled_window_update_scrollbar_visibility_flags (scrolled_window,
+                                                                 priv->hscrollbar);
 
-         if (priv->vscrollbar)
-           gtk_scrolled_window_adjustment_changed
-              (gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->vscrollbar)), scrolled_window);
+          gtk_scrolled_window_update_scrollbar_visibility_flags (scrolled_window,
+                                                                 priv->vscrollbar);
 
          /* If, after the first iteration, the hscrollbar and the
           * vscrollbar flip visiblity... or if one of the scrollbars flip
@@ -3377,12 +3408,11 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment,
        {
          gboolean visible;
 
-         visible = priv->hscrollbar_visible;
-         priv->hscrollbar_visible = (gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_lower (adjustment) >
-                                     gtk_adjustment_get_page_size (adjustment));
+          visible = priv->hscrollbar_visible;
+          gtk_scrolled_window_update_scrollbar_visibility_flags (scrolled_window, priv->hscrollbar);
 
-         if (priv->hscrollbar_visible != visible)
-           gtk_widget_queue_resize (GTK_WIDGET (scrolled_window));
+          if (priv->hscrollbar_visible != visible)
+            gtk_widget_queue_resize (GTK_WIDGET (scrolled_window));
        }
     }
   else if (adjustment == gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->vscrollbar)))
@@ -3391,12 +3421,11 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment,
        {
          gboolean visible;
 
-         visible = priv->vscrollbar_visible;
-         priv->vscrollbar_visible = (gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_lower (adjustment) >
-                                     gtk_adjustment_get_page_size (adjustment));
+          visible = priv->vscrollbar_visible;
+          gtk_scrolled_window_update_scrollbar_visibility_flags (scrolled_window, priv->vscrollbar);
 
-         if (priv->vscrollbar_visible != visible)
-           gtk_widget_queue_resize (GTK_WIDGET (scrolled_window));
+          if (priv->vscrollbar_visible != visible)
+            gtk_widget_queue_resize (GTK_WIDGET (scrolled_window));
        }
     }
 }